package main

import "fmt"

func main() {
	/*
		位运算：将数值转成二进制后，按位操作
		与：&
			对应为都为1则为1，有一个0则为0
			1&1=1 1&0=0 0&1=0 0&0=0
		或：|
			对应为都为0则为0，有一个1则为1
			1|1=1 1|0=1 0|1=1 0|0=0
		异或：^
			二元：a^b
				对应为值不同则为1，相同则为0
				1^1=0 1^0=1 0^1=1 0^0=0
			一元：^a
				按位取反
				^1=0 ^0=1
		位清空：&^
			对于：a &^ b
				对于b上每一位
				如果为0，则取a对于的位
				如果为1，则取0
	*/

	a := 60
	b := 13
	//a:60 111100
	fmt.Printf("a:%d %b\n", a, a)
	//b:13 b:1101
	fmt.Printf("b:%d b:%b\n", b, b)

	/*
		a：60 0011 1100
		b：13 0000 1101
		&：12 0000 1100
	*/
	and := a & b
	fmt.Printf("a&b：%d %b\n", and, and)

	/*
		a：60 0011 1100
		b：13 0000 1101
		|：61 0011 1101
	*/
	or := a | b
	fmt.Printf("a|b：%d %b\n", or, or)

	/*
		a：60 0011 1100
		b：13 0000 1101
		^：49 0011 0001
	*/
	xor := a ^ b
	fmt.Printf("a^b：%d %b\n", xor, xor)

	/*
		a： 60 0011 1100
		b： 13 0000 1101
		&^：48 0011 0000
	*/
	clear := a &^ b
	fmt.Printf("a&^b：%d %b\n", clear, clear)

	/*
		a： 60 0011 1100
		^：-61 1011 1101
	*/
	non := ^a
	fmt.Printf("^a：%d %b\n", non, non)

	/*
		c << 2：64 1000000
		c >> 2：4 100
	*/
	c := 16
	fmt.Printf("c << 2：%d %b\n", c<<2, c<<2)
	fmt.Printf("c >> 2：%d %b\n", c>>2, c>>2)
}
